home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / 3DTOSHI2.ZIP / mpgfx / source / gfxdpmi.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-14  |  7.1 KB  |  286 lines

  1.  
  2. // gfxdpmi.cpp
  3. //
  4. // Copyright (c) 1995 by Toshiaki Tsuji, all rights reserved.
  5.  
  6. #include "stdgfx.h"
  7. #include "gfxdpmi.h"
  8.  
  9. DPMITOOL DPMI;
  10.  
  11. DPMITOOL::DPMITOOL () : SYSTEMTOOL ()
  12.   {
  13.     RmRegs = new RMREGS;  
  14.   } // End of Constructor for DPMITOOL
  15.  
  16. DPMITOOL::~DPMITOOL ()
  17.   {
  18.     delete RmRegs;  
  19.         RmRegs = NULL;
  20.   } // End of Destructor for DPMITOOL
  21.  
  22. VOID DPMITOOL::InitRmRegs ()
  23.   {
  24.     memset ( RmRegs, 0, 50 );
  25.   } // End of InitRmRegs for DPMITOOL
  26.  
  27. VOID DPMITOOL::SetRmRegs ( union REGS *InRegs )
  28.   {
  29.     struct SREGS SRegs;
  30.  
  31.     #if defined (__FORWINDOWS__)
  32.       if (SRegs.es)
  33.         {}
  34.       if (InRegs)
  35.         {}
  36.     #elif defined (__FOROS2__)
  37.       if (SRegs.es)
  38.         {}
  39.       if (InRegs)
  40.         {}
  41.     #elif defined (__FORDOS__)
  42.       segread ( &SRegs );
  43.       InitRmRegs ();
  44.       SetRmRegs ( InRegs, &SRegs );
  45.     #endif
  46.   } // End of SetRmRegs for DPMITOOL
  47.  
  48. VOID DPMITOOL::SetRmRegs ( union REGS *InRegs, struct SREGS *SRegs )
  49.   {
  50.     InitRmRegs ();
  51.  
  52.     RmRegs->ES = SRegs->es;
  53.     RmRegs->DS = SRegs->ds;
  54.     RmRegs->CS = SRegs->cs;
  55.     RmRegs->SS = SRegs->ss;
  56.  
  57.     if (InRegs)
  58.      {}
  59.     if (SRegs)
  60.      {}
  61.             
  62.     #if defined (__FORWINDOWS__)
  63.     #elif defined (__FOROS2__)
  64.     #elif defined (__FORDOS__)
  65.       #ifdef __32BIT__
  66.         RmRegs->EDI = InRegs->x.edi;
  67.         RmRegs->ESI = InRegs->x.esi;
  68.         RmRegs->EBX = InRegs->x.ebx;
  69.         RmRegs->EDX = InRegs->x.edx;
  70.         RmRegs->ECX = InRegs->x.ecx;
  71.         RmRegs->EAX = InRegs->x.eax;
  72.         segread ( &SegRegs );
  73.         #if defined (__FORDOSPWPK32__)
  74.            Regs.x.edi = (DWORD)RmRegs;
  75.         #else
  76.            SegRegs.es = FP_SEG ( RmRegs );
  77.            Regs.x.edi = FP_OFF ( RmRegs );
  78.         #endif
  79.       #else
  80.         RmRegs->EDI = InRegs->x.di;
  81.         RmRegs->ESI = InRegs->x.si;
  82.         RmRegs->EBX = InRegs->x.bx;
  83.         RmRegs->EDX = InRegs->x.dx;
  84.         RmRegs->ECX = InRegs->x.cx;
  85.         RmRegs->EAX = InRegs->x.ax;
  86.         SegRegs.es = (WORD)FP_SEG ( RmRegs );
  87.         Regs.x.di = (WORD)FP_OFF ( RmRegs );
  88.       #endif
  89.     #endif
  90.   } // End of SetRmRegs for DPMITOOL
  91.  
  92. VOID DPMITOOL::GetRmRegs ( union REGS *OutRegs )
  93.   {
  94.     GetRmRegs ( OutRegs, NULL );
  95.   } // End of GetRmRegs for DPMITOOL
  96.  
  97. VOID DPMITOOL::GetRmRegs ( union REGS *OutRegs, struct SREGS *SRegs )
  98.   {
  99.     if (SRegs!=NULL)
  100.       {
  101.         SRegs->es = RmRegs->ES;
  102.         SRegs->ds = RmRegs->DS;
  103.         SRegs->cs = RmRegs->CS;
  104.         SRegs->ss = RmRegs->SS;
  105.       } // End if
  106.  
  107.     if (OutRegs)
  108.       {}
  109.     #if defined (__FORWINDOWS__)
  110.     #elif defined (__FOROS2__)
  111.     #elif defined (__FORDOS__)
  112.       #ifdef __32BIT__
  113.         OutRegs->x.edi = RmRegs->EDI;
  114.         OutRegs->x.esi = RmRegs->ESI;
  115.         OutRegs->x.ebx = RmRegs->EBX;
  116.         OutRegs->x.edx = RmRegs->EDX;
  117.         OutRegs->x.ecx = RmRegs->ECX;
  118.         OutRegs->x.eax = RmRegs->EAX;
  119.       #else
  120.         OutRegs->x.di = RmRegs->EDI;
  121.         OutRegs->x.si = RmRegs->ESI;
  122.         OutRegs->x.bx = RmRegs->EBX;
  123.         OutRegs->x.dx = RmRegs->EDX;
  124.         OutRegs->x.cx = RmRegs->ECX;
  125.         OutRegs->x.ax = RmRegs->EAX;
  126.       #endif  
  127.     #endif
  128.   } // End of SetRmRegs for DPMITOOL
  129.  
  130. VOID DPMITOOL::Int86 ( INT IntNo, union REGS *InRegs, union REGS *OutRegs )
  131.   {
  132.     SetRmRegs ( InRegs );
  133.     if (InRegs)
  134.       {}
  135.     if (IntNo)
  136.       {}
  137.     #if defined (__FORWINDOWS__)
  138.     #elif defined (__FOROS2__)
  139.     #elif defined (__FORDOS__)
  140.       Regs16.ax = 0x0300;
  141.       Regs16.bx = (WORD)IntNo;
  142.       Regs.h.bh = 0;
  143.       Regs16.cx = 25;
  144.       Regs16.dx = 0;
  145.       INTERRUPTx ( INT_DPMI, &Regs, &Regs, &SegRegs );
  146.     #endif
  147.             
  148.     GetRmRegs ( OutRegs );
  149.   } // End of Int86 for DPMITOOL
  150.  
  151. VOID DPMITOOL::Int86x ( INT IntNo, union REGS *InRegs, union REGS *OutRegs, struct SREGS* SRegs )
  152.   {
  153.     SetRmRegs ( InRegs, SRegs );
  154.     if (IntNo)
  155.       {}
  156.     #if defined (__FORWINDOWS__)
  157.     #elif defined (__FOROS2__)
  158.     #elif defined (__FORDOS__)
  159.       Regs16.ax = 0x0300;
  160.       Regs16.bx = (WORD)IntNo;
  161.       Regs.h.bh = 0;
  162.       Regs16.cx = 25;
  163.       Regs16.dx = 0;
  164.       INTERRUPTx ( INT_DPMI, &Regs, &Regs, &SegRegs );
  165.     #endif
  166.     GetRmRegs ( OutRegs );
  167.   } // End of Int86x for DPMITOOL
  168.  
  169. VOID DPMITOOL::AllocateDOSMemory ( INT NumPara, WORD* Selector, WORD* Segment )
  170.   {
  171.     #if defined (__FORWINDOWS__)
  172.       if(NumPara)
  173.         {}
  174.     #elif defined (__FOROS2__)
  175.       if(NumPara)
  176.         {}
  177.     #elif defined (__FORDOS__)
  178.       Regs16.ax = 0x0100;
  179.       Regs16.bx = (WORD)NumPara;
  180.       INTERRUPT ( INT_DPMI, &Regs, &Regs );
  181.       *Selector = Regs16.dx;
  182.       *Segment = Regs16.ax;
  183.     #endif
  184.     if (Selector)
  185.       {}
  186.     if (Segment)
  187.       {}
  188.     if (NumPara)
  189.       {}
  190.   } // End of AllocateDOSMemory for DPMITOOL
  191.  
  192. VOID DPMITOOL::FreeDOSMemory ( WORD Selector )
  193.   {
  194.     if (Selector)
  195.       {}
  196.     #if defined (__FORWINDOWS__)
  197.     #elif defined (__FOROS2__)
  198.     #elif defined (__FORDOS__)
  199.        Regs16.ax = 0x0100;
  200.        Regs16.dx = Selector;
  201.        INTERRUPT ( INT_DPMI, &Regs, &Regs );
  202.     #endif
  203.   } // End of FreeDOSMemory for DPMITOOL
  204.  
  205. VOID* DPMITOOL::MapRealToLinear ( DWORD Pointer )
  206.   {
  207.     WORD Seg,Off;
  208.     Seg = (WORD)(Pointer>>12);
  209.     Off = (WORD)(Pointer&0xFFFF);
  210.     return (VOID*)(Seg+Off);
  211.   } // End of MapRealToLinear for DPMITOOL
  212.  
  213. WORD DPMITOOL::AllocateSelector ( INT NumSelector )
  214.   {
  215.     if (NumSelector)
  216.       {}
  217.     #if defined (__FORWINDOWS__)
  218.       return 0;
  219.     #elif defined (__FOROS2__)
  220.       return 0;
  221.     #elif defined (__FORDOS__)
  222.       Regs16.ax = 0x0000;
  223.       Regs16.cx = (WORD)NumSelector;
  224.       INTERRUPT ( INT_DPMI, &Regs, &Regs );
  225.       if ( Regs16.cflag )
  226.         return 0;
  227.       return Regs16.ax;
  228.     #endif
  229.   } // End of AllocateSelector for DPMITOOL
  230.  
  231. VOID DPMITOOL::FreeSelector ( WORD Selector )
  232.   {
  233.     if (Selector)
  234.       {}
  235.     #if defined (__FORWINDOWS__)
  236.     #elif defined (__FOROS2__)
  237.     #elif defined (__FORDOS__)
  238.       Regs16.ax = 0x0001;
  239.       Regs16.bx = Selector;
  240.       INTERRUPT ( INT_DPMI, &Regs, &Regs );
  241.     #endif
  242.   } // End of FreeSelector for DPMITOOL
  243.  
  244. BOOLEAN DPMITOOL::SetSelectorAddress ( WORD Selector, DWORD Address )
  245.   {
  246.     if (Selector)
  247.       {}
  248.     if (Address)
  249.       {}
  250.     #if defined (__FORDOS__)
  251.       Regs16.ax = 0x0007;
  252.       Regs16.bx = Selector;
  253.       Regs16.cx = (WORD)(Address>>16);
  254.       Regs16.dx = (WORD)(Address&0xFFFF);
  255.       INTERRUPT ( INT_DPMI, &Regs, &Regs );
  256.       if ( Regs16.cflag )
  257.         return 0;
  258.       return Regs16.ax;
  259.     #else
  260.       return 0;  
  261.     #endif
  262.   } // End of SetSelectorAddress for DPMITOOL
  263.  
  264. BOOLEAN DPMITOOL::SetSelectorLimit ( WORD Selector, DWORD Limit )
  265.   {
  266.     if (Selector)
  267.       {}
  268.     if (Limit)
  269.       {}
  270.     #if defined (__FORDOS__)
  271.       Regs16.ax = 0x0008;
  272.       Regs16.bx = Selector;
  273.       Regs16.cx = (WORD)(Limit>>16);
  274.       Regs16.dx = (WORD)(Limit&0xFFFF);
  275.       INTERRUPT ( INT_DPMI, &Regs, &Regs );
  276.       if ( Regs16.cflag )
  277.         return 0;
  278.       return Regs16.ax;
  279.     #else
  280.       return 0;  
  281.     #endif
  282.   } // End of SetSelectorLimit for DPMITOOL
  283.  
  284.  
  285.  
  286.